package dletc.demo;

public class demo02 {

	public static void main(String[] args) {
		/**
		 * String类：
		 * String特点：
			 * 1 不可以被继承，因为  public final class String
			 * 2 可以支持序列化（网络传输），实现了Serializable接口
			 * 3 可以实现比较大小，  实现了Comparable接口
			 * 4 内部用一个字符数组存储数据，  底层是个数组：  private final byte value[];
			 * 
			String 类的不可变性：我看过源代码  String类中有一个byte数组(jdk9之前是 char数组)，并且该byte数组是final修饰的，所以String不可变。
			
				*  当第一次创建String对象的时候，会将字面值存储“字符串常量池”中。
				*  如果第二次在创建String对象的赋值的时候，先要到常量池中查看有没有
				*  重复的数据，如果没有需要创建空间重新赋值，如果有，用已经存在的数据
				*  总结： 只要你对字符串进行修改，都必须重写创建一个新的对象，原有的值没有被改变
			如果去做地址值比较的技巧：
				常量与常量拼接，结果是放在常量池中
		 *		 有变量参与，结果就在堆中。
		 */
		String a = "abc";
		String b = "abc";
		System.out.println(a == b); //结果为true 因为都在字符串常量池中。
		
		String c = new String("abc");
		
		String d = new String("abc");
		
		System.out.println(c == d);//结果为false 因为在堆区开辟空间。
		
		/**
		 * 常量与常量拼接，结果是放在常量池中
		 * 有变量参与，结果就在堆中。
		 */
		 String s1 = "javaEE";
		    String s2 = "hadoop";
		    
		    String s3 = "javaEEhadoop";        //常量池中
		    String s4 = "javaEE" + "hadoop";  //常量池中
		    String s5 = s1 + "hadoop";       //new
		    String s6 = "javaEE" + s2;      //new
		    String s7 =  s1 + s2;          //new
		    
		    System.out.println(s3 == s4);//true
		    System.out.println(s3 == s5);//false
		    System.out.println(s3 == s6);//false
		    System.out.println(s3 == s7);//false
		    System.out.println(s5 == s6);//false
		    System.out.println(s6 == s7);//false
		    System.out.println(s5 == s7);//false
		    
		    
		    String s8 = s5.intern();//返回为字符串常量池中的数据
		    System.out.println(s8 == s3);//true
		    
		 

		
	

	}

}
